dotnet8/web/{{cookiecutter.project_name}}/src/ServerlessAPI/Repositories/BookRepository.cs (106 lines of code) (raw):

using Amazon.DynamoDBv2.DataModel; using Amazon.DynamoDBv2.DocumentModel; using ServerlessAPI.Entities; namespace ServerlessAPI.Repositories; public class BookRepository : IBookRepository { private readonly IDynamoDBContext context; private readonly ILogger<BookRepository> logger; public BookRepository(IDynamoDBContext context, ILogger<BookRepository> logger) { this.context = context; this.logger = logger; } public async Task<bool> CreateAsync(Book book) { try { book.Id = Guid.NewGuid(); await context.SaveAsync(book); logger.LogInformation("Book {} is added", book.Id); } catch (Exception ex) { logger.LogError(ex, "fail to persist to DynamoDb Table"); return false; } return true; } public async Task<bool> DeleteAsync(Book book) { bool result; try { // Delete the book. await context.DeleteAsync<Book>(book.Id); // Try to retrieve deleted book. It should return null. Book deletedBook = await context.LoadAsync<Book>(book.Id, new DynamoDBContextConfig { ConsistentRead = true }); result = deletedBook == null; } catch (Exception ex) { logger.LogError(ex, "fail to delete book from DynamoDb Table"); result = false; } if (result) logger.LogInformation("Book {Id} is deleted", book); return result; } public async Task<bool> UpdateAsync(Book book) { if (book == null) return false; try { await context.SaveAsync(book); logger.LogInformation("Book {Id} is updated", book); } catch (Exception ex) { logger.LogError(ex, "fail to update book from DynamoDb Table"); return false; } return true; } public async Task<Book?> GetByIdAsync(Guid id) { try { return await context.LoadAsync<Book>(id); } catch (Exception ex) { logger.LogError(ex, "fail to update book from DynamoDb Table"); return null; } } public async Task<IList<Book>> GetBooksAsync(int limit = 10) { var result = new List<Book>(); try { if (limit <= 0) { return result; } var filter = new ScanFilter(); filter.AddCondition("Id", ScanOperator.IsNotNull); var scanConfig = new ScanOperationConfig() { Limit = limit, Filter = filter }; var queryResult = context.FromScanAsync<Book>(scanConfig); do { result.AddRange(await queryResult.GetNextSetAsync()); } while (!queryResult.IsDone && result.Count < limit); } catch (Exception ex) { logger.LogError(ex, "fail to list books from DynamoDb Table"); return new List<Book>(); } return result; } }